Activity的四种启动模式

前两天在开发中碰到一些Activity重用的需求,流程如下:

MainActivity–>FirstActivity–>SecondActivity–>LoginActivity–>MainActivity

因为MainActivity是程序的主界面,一般都将其放置栈底,不可能干掉他,但是我们又要怎么回到MainActivity而又不会重新创建它呢?那就是利用Android的启动模式,下面就来简单介绍一下。

简介

在android里,有4种activity的启动模式,分别为:

standard: 标准模式,一调用startActivity()方法就会产生一个新的实例。

singleTop: 如果已经有一个实例位于Activity栈的顶部时,就不产生新的实例,而只是调用Activity中的newInstance()方法。如果不位于栈顶,会产生一个新的实例。

singleTask: 会在一个新的task中产生这个实例,以后每次调用都会使用这个,不会去产生新的实例了。

singleInstance: 这个跟singleTask基本上是一样,只有一个区别:在这个模式下的Activity实例所处的task中,只能有这个activity实例,不能有其他的实例。

上面的例子中我们就可以设置MainActivity的启动模式为singleTask,这样就可以保证它单实例存在了。

四种加载模式的区别

所属task的区别

一般情况下,“standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,就相当于谁调用它,它就跟谁在同一个Task中。除非Intent包括参数FLAG_ACTIVITY_NEW_TASK。如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。
“singleTask”和”singleInstance” 总是把要启动的activity作为一个task的根元素,他们不会被启动到一个其他task里。

是否允许多个实例

“standard”和”singleTop”可以被实例化多次,并且是可以存在于不同的task中;这种实例化时一个task可以包括一个activity的多个实例;“singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。singleTop 要求如果创建intent的时候栈顶已经有要创建的Activity的实例,则将intent发送给该实例,而不创建新的实例。

注意事项

当我们调用OnNewIntent时的需要注意当前Activity可能会被后台回收,导致数据丢失,详见:http://blog.csdn.net/tyj1982/article/details/6848879